package com.juego.male;

import java.util.ArrayList;
import java.util.concurrent.Semaphore;

import com.juego.utilidades.InfoAlertas;
import com.juego.utilidades.Jugador;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Looper;
import android.os.Parcel;
import android.os.Parcelable;
import android.renderscript.Sampler.Value;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView.OnEditorActionListener;

public class Configura_partida extends Activity{

	private LinearLayout vista, layout;
	private ArrayList<EditText> et_jugadores;
	private Bundle bundle;	
	private Button bt_empezar;	
	private Jugador jugador;	
	private ArrayList<Jugador> jugadores;
	private EditText dinero, entrada, apuesta_minima;
//	private ArrayList<String> strings;
	private boolean jugar;
	private Semaphore semAlert;
	private InfoAlertas infoalertas;




	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.configura_partida);
		iniciaCampos();

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.juego, menu);
		return true;
	}


	/**
	 * Crea tantos nombres de jugador como jugadores le llegan de la 
	 * Pantalla anterior.
	 */
	public void iniciaCampos(){
		final Activity activity = this;
		infoalertas = new InfoAlertas();
		vista = (LinearLayout)findViewById(R.id.pantalla_configura_partida);
		layout = (LinearLayout)findViewById(R.id.listajugadores);
		LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
		layoutParams.setMargins(0, 10, 0, 0);
		et_jugadores = new ArrayList<EditText>();
		bundle = getIntent().getExtras();
		dinero = (EditText)findViewById(R.id.et_dinero_inicial);
		entrada = (EditText)findViewById(R.id.et_ciega);
		apuesta_minima = (EditText)findViewById(R.id.et_apuesta_minima);


		for (int i = 0; i < bundle.getInt("num_jugadores"); i++) {
			EditText et_aux = new EditText(this);
			et_aux.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
			et_aux.setHint(getString(R.string.jugador) +" " + String.valueOf(i+1));
			et_aux.setBackgroundResource(R.drawable.sh_edit_text);
			et_aux.addTextChangedListener(textwatcher);			
			et_jugadores.add(et_aux);
			layout.addView(et_aux,layoutParams);				
		}


		bt_empezar = (Button)findViewById(R.id.bt_empezar_a_jugar);

		bt_empezar.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				jugador = new Jugador();
				jugadores = new ArrayList<Jugador>();

				EditText edit;
				for (int i = 0; i < et_jugadores.size(); i++) {
					jugador = new Jugador();
					edit = (EditText)et_jugadores.get(i);
					jugador.setNombre(edit.getText().toString());
					if (!dinero.getText().toString().equals(""))
						jugador.setDinero(Double.valueOf(dinero.getText().toString()));
					jugadores.add(jugador);
				}


				if (nombreParticipantes(jugadores)){					
					if (dineroInicial(dinero, entrada, apuesta_minima)){
						//						Log.d("eeeee","despues de comprobar dentro");
						Intent intent = new Intent(getApplication(), Partida.class);				
						Bundle bund = new Bundle();
						bund.putDouble("ciega", Double.valueOf(entrada.getText().toString()));
						if (!apuesta_minima.getText().toString().trim().equals(""))
							bund.putDouble("apuesta_minima", Double.valueOf(apuesta_minima.getText().toString()));
						else
							bund.putDouble("apuesta_minima", 0);
						intent.putExtra("jugadores", jugadores);
						intent.putExtras(bund);
						startActivity(intent);
					} 
					//					Log.d("eeeee","despues de comprobar");
				}
			}
		});

	}


	private TextWatcher textwatcher = new TextWatcher() {
		boolean intro;

		@Override
		public void onTextChanged(CharSequence s, int start, int before, int count) {	
			for (int i = 0; i < s.length(); i++) {
				if (s.charAt(i) == '\n'){
					intro = true;
					break;
				}
			}
		}

		@Override
		public void beforeTextChanged(CharSequence s, int start, int count,
				int after) {
			
			
		}

		@Override
		public void afterTextChanged(Editable s) {
			if (intro){
				for (int i = 0; i < bundle.getInt("num_jugadores"); i++) {
					if (i < bundle.getInt("num_jugadores")-1){
						if (et_jugadores.get(i) == vista.findFocus()){
							et_jugadores.get(i).setSingleLine();							
							et_jugadores.get(i+1).requestFocus();	
							break;
						}
					} else if (i == bundle.getInt("num_jugadores")-1){
						Log.d("else"," pues eso en el else");
						et_jugadores.get(i).setSingleLine();
						vista.clearFocus();
						dinero.requestFocus();						
					}

				}
				intro = false;
			}

		}
	};





	///////////////////Validaciones y Alerts//////////////////////////



	/**
	 * Valida el nombre de los jugadores
	 * @param jug
	 * @return
	 */
	public boolean nombreParticipantes(ArrayList<Jugador> jug){
		
		ArrayList<Jugador> aux = jug;		
//		strings = new ArrayList<String>();
//		strings.add(getString(R.string.titulo));
		infoalertas.resetInfo();
		infoalertas.setMensajeTitulo(getString(R.string.titulo));
		for (int i = 0; i < jug.size(); i++) {
			for (int j = 0; j < aux.size(); j++) {
				if (jug.get(i).getNombre().trim().equals("") || (jug.get(i).getNombre().trim().equals(aux.get(j).getNombre().trim()) && i != j)){
//					strings.add(getString(R.string.sin_nombre));
					infoalertas.setMensajeDos(getString(R.string.sin_nombre));
					showAlerta(infoalertas);
					return false;						
				}
			}
		}
		return true;		
	}

	/**
	 * Valida las cantidades de dinero iniciales de cada partida
	 * @param et_dinero
	 * @param et_entrada
	 * @param et_apuesta_minima
	 * @return
	 */
	public boolean dineroInicial(EditText et_dinero, EditText et_entrada, EditText et_apuesta_minima){
		double apuesta_aux;
//		strings = new ArrayList<String>();
//		strings.add(getString(R.string.titulo));
		infoalertas.resetInfo();
		infoalertas.setMensajeTitulo(getString(R.string.titulo));
		if (et_dinero.getText().toString().equals("")) {
//			strings.add(getString(R.string.sin_dinero_inicial));
			infoalertas.setMensajeDos(getString(R.string.sin_dinero_inicial));
			showAlerta(infoalertas);
			return false;
		} 		
		if (et_entrada.getText().toString().equals("")){
//			if (strings.size()>1)
//				strings.remove(1);
//			strings.add(getString(R.string.sin_entrada));
			infoalertas.setMensajeDos(getString(R.string.sin_entrada));
			showAlerta(infoalertas);
			return false;
		}

		if (et_apuesta_minima.getText().toString().equals(""))
			apuesta_aux = 0;
		else
			apuesta_aux = Double.valueOf(et_apuesta_minima.getText().toString());

		if(apuesta_aux == 0){
//			if (strings.size()>1)
//				strings.remove(1);
//			strings.add(getString(R.string.sin_apuesta_minima));
			infoalertas.setMensajeDos(getString(R.string.sin_apuesta_minima));
			semAlert = new Semaphore(0);	

			new Thread()
			{
				@Override
				public void run() {
					Looper.prepare();			    	
					showAlertaDos(infoalertas);
					Looper.loop();
					Looper.myLooper().quit();
				}
			}.start();

			try {
				semAlert.acquire();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			if (!jugar)
				return false;
		}

		if (Double.valueOf(et_entrada.getText().toString()) + apuesta_aux*2 > Double.valueOf(et_dinero.getText().toString())){
//			if (strings.size()>1)
//				strings.remove(1);
			infoalertas.setMensajeDos(getString(R.string.aprende_a_sumar));
//			strings.add(getString(R.string.aprende_a_sumar));
			showAlerta(infoalertas);
			return false;
		}
		return true;
	}


	/**
	 * Muestra un alert con solo un boton
	 * @param mensajes
	 */
	public void showAlerta(InfoAlertas info){

		AlertDialog.Builder alert = new AlertDialog.Builder(this);
		alert.setCancelable(false);

		alert.setMessage(info.getMensajeDos())
		.setTitle(info.getMensajeTitulo())
		.setPositiveButton("OK", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int id) {
				dialog.cancel();
			}
		}).create().show();
	}

	/**
	 * Muestra un alert de dos opciones 
	 * @param mensajes
	 */
	public void showAlertaDos(InfoAlertas info){

		Log.d("EEEEE","estoy en el Alert");


		AlertDialog.Builder alert = new AlertDialog.Builder(this);
		alert.setCancelable(false);

		alert.setMessage(info.getMensajeDos())
		.setTitle(info.getMensajeTitulo())
		.setNegativeButton("Jugar", new DialogInterface.OnClickListener() {

			public void onClick(DialogInterface dialog, int id) {
				dialog.cancel();
				jugar = true;
				semAlert.release();
			}			
		})
		.setPositiveButton("Cambiar", new DialogInterface.OnClickListener() {

			public void onClick(DialogInterface dialog, int id) {
				dialog.cancel();
				jugar = false;
				semAlert.release();
			}
		}).create().show();

	}

}
